"""
{'Storage IP': '192.168.98.74',
＃　　返回的是文件的存储的地址
'Remote file_id': 'group1/M00/00/00/wKhiSlvqkB2AUwgAAADB_RbUaI8801.jpg',
'Uploaded size': '48.00KB',
'Group name': 'group1',
 'Status': 'Upload successed.',
 'Local file name': '/home/python/Desktop/测试图片/66.jpg'}


 自定义文件存储

"""

from django.core.files.storage import Storage
# 您的存储类必须是可解构的， 以便在迁移中的字段上使用时可以对其进行序列化。只要您的字段具有可自行序列化的参数，就 可以使用 django.utils.deconstruct.deconstructible类装饰器
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client

# 您的自定义存储系统必须是以下子类 django.core.files.storage.Storage
# from mall import settings
from django.conf import settings


@deconstructible
class MyStorage(Storage):
    # Django必须能够在没有任何参数的情况下实例化您的存储系统。这意味着任何设置都应该来自django.conf.settings
    def __init__(self, conf_path=None, ip=None):
        if not conf_path:
            conf_path = settings.FDFS_CLIENT_CONF
        self.conf_path = conf_path

        if not ip:
            ip = settings.FDFS_URL
        self.ip = ip

    # 您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法
    def _open(self, name, mode='rb'):
        """
        打开图片，因为我们用http打开的 ,不需要打开图片，所有这里不需要写任何方法

        """
        pass

    def _save(self, name, content, max_length=None):
        """
        保存
        创建客户端实例对象
        上传图片
        返回filed_id
        """
        # 创建客户端实例对象
        #  配置文件路径
        client = Fdfs_client(self.conf_path)
        # 上传图片
        # client.upload_by_filename()  上传的是图片的名字(路径)
        data = content.read()

        # client.upload_by_buffer(data)  上传图片的二进制
        result = client.upload_by_buffer(data)
        # 返回filed_id
        if result.get('Status') == 'Upload successed.':
            #  不为空说明上传成功了，获取files_id
            file_id = result.get('Remote file_id')
            #  获取id成功需要将id返回
            return file_id
        else:
            raise Exception('上传失败')

    # 判断图片是否存在
    #  fastdfs会自动处理图片重名的情况
    #  返回false就是说图片随便上传，不会出现覆盖的现象
    def exists(self, name):
        return False

    def url(self, name):
        """
        url默认是返回文件名
        name = file_id
        我们这里需要返回一个url，所以需要修改返回值，所以把拼接好的url返回
        :param name:
        :return:
        """
        return self.ip + name
